package com.titaniume.java;

import org.junit.Test;

import java.util.*;
import java.util.function.Consumer;

/**
 *@program: java8
 *@description:
 * 一、Lambda 表达式的基础语法：java8中 引入了一个新的操作符号 "->" 该操作符称为箭头操作符或Lambda 操作符
 *  左侧：Lambda 表达式的参数列表
 *  右侧：Lambda 表达式中所需要执行的功能 即Lambda 体
 *
 *  语法格式一：无参数，无返回值
 *      () -> System.out.println("hello lambda")
 *
 *  语法格式二：有一个参数，并且无返回值
 *       (x) -> System.out.println(x)
 *
 *  语法格式三： 若只有一个参数，小括号可以申领不写
 *       x -> System.out.println(x)
 *
 *  语法格式四： 有两个以上参数，有返回值，并且Lambda 体中有多条语句
 *     Comparator<Integer> com = (x,y) -> {
 *             System.out.println("函数式接口");
 *             return  Integer.compare(x,y);
 *         };
 *
 *   语法格式五： 若Lambda体中 只有一条语句 return 和大括号 可以省略不写
 *     Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
 *
 *   语法格式六： Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出 数据类型 即 "类型推断"
 *
 *   左右遇一括号省
 *   左侧推断类型省
 *
 *
 *  二、Lambda 表达式需要"函数式接口的支持"
 *   函数式接口： 接口中只有一个抽象方法的接口,成为函数式接口。可以用@FunctionInterface修饰
 *      可以检查是否是函数式接口
 *
 *
 *@author: renfei.huang
 *@create: 2021-10-28 13:59
 */
public class TestLambda2 {

    @Test
    public void  test1(){

        int num = 0; //jdk 1.7 以前 必须是final
        //匿名内部类的局部变量 是final 1.8之后省略了final

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world" + num);
            }
        };
        runnable.run();

        System.out.println("------------------------");

        Runnable runnable1 = () -> System.out.println("hello lambda"+num);
        runnable1.run();
    }


    @Test
    public  void  test2(){

//        Consumer<String> con = (x) -> System.out.println(x);
        Consumer<String> con = x -> System.out.println(x);
        con.accept("我来自中国");
    }

    @Test
    public  void  test3(){
        Comparator<Integer> com = (x,y) -> {
            System.out.println("函数式接口");
            return  Integer.compare(x,y);
        };
    }

    @Test
    public  void  test4(){
        Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
    }


    @Test
    public  void test5(){
        //类型推断
        String [] str ={"aaa","bbb","ccc"};
        List<String> list = new ArrayList<>();
        show(new HashMap<>());
    }

    public  void  show(Map<String,Integer> map){

    }

    //需求：对一个数进行运算
    @Test
    public void test6(){

        Integer num = operation(100, (x) -> x * x);
        System.out.println(num);

        Integer add = operation(200, (y) -> y + 200);
        System.out.println(add);
    }

    public  Integer operation(Integer num,MyFun mf){
        return  mf.getValue(num);
    }

}
